home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / SAT 2.3.8 / Libraries & Documentation / Add-ons / Graphic effects / AlphaSAT.p next >
Text File  |  1996-01-04  |  4KB  |  172 lines

  1. {These routines set or reset the alpha channel in 32-bit color. It is of interest}
  2. {when using SAT for mixing graphics with live video, using a video board that}
  3. {supports the alpha channel.}
  4.  
  5. {This unit has not been tested much yet. Use with caution.}
  6.  
  7. {By Ingemar Ragnemalm 1995-1996.}
  8.  
  9. unit AlphaSAT;
  10.  
  11. interface
  12.     uses
  13.         SAT;
  14.  
  15.     procedure SATFillAlphaRect (box: Rect; port: SATPort);
  16.     procedure SATPaintAlphaRect (box: Rect; port: SATPort; value: Integer);
  17.     procedure SATEraseAlphaRect (box: Rect; port: SATPort);
  18.  
  19. implementation
  20.  
  21.     procedure SATFillAlphaRect (box: Rect; port: SATPort);
  22.         type
  23.             LongPtr = ^Longint;
  24.         var
  25.             savePort: SATPort;
  26.             globalBox: Rect;
  27.             pix: PixMapHandle;
  28.             h, v: Integer;
  29.             pixel: LongPtr;
  30.             maxV, maxH: integer;
  31.     begin
  32.         if not gSAT.colorFlag then
  33.             Exit(SATFillAlphaRect);
  34.         if port.device^^.gdPMap^^.pixelSize <> 32 then
  35.             Exit(SATFillAlphaRect);
  36.  
  37.         SATGetPort(savePort);
  38.         SATSetPort(port);
  39.  
  40.         globalBox := box;
  41.         LocalToGlobal(globalBox.topLeft);
  42.         LocalToGlobal(globalBox.botRight);
  43.         pix := port.device^^.gdPMap;
  44.  
  45.         if box.bottom < port.port^.portRect.bottom then
  46.             maxV := box.bottom - 1
  47.         else
  48.             maxV := port.port^.portRect.bottom - 1;
  49.  
  50.         if box.right < port.port^.portRect.right then
  51.             maxH := box.right - 1
  52.         else
  53.             maxH := port.port^.portRect.right - 1;
  54.  
  55.         if box.left < maxH then
  56.             if box.top < maxV then
  57.                 for v := box.top to maxV do
  58.                     begin
  59.                         pixel := LongPtr(Longint(pix^^.baseAddr) + BitAnd(pix^^.rowBytes, $3fff) * Longint(v) + 4 * box.left);
  60.                         for h := box.left to maxH do
  61.                             begin
  62.                                 pixel^ := BitOr(pixel^, $ff000000); {Fill}
  63.                                 pixel := LongPtr(Longint(pixel) + 4);
  64.                             end;
  65.                     end;
  66.  
  67.         SATSetPort(savePort);
  68.     end; {SATFillAlphaRect}
  69.  
  70.     procedure SATPaintAlphaRect (box: Rect; port: SATPort);
  71.         type
  72.             LongPtr = ^Longint;
  73.         var
  74.             savePort: SATPort;
  75.             globalBox: Rect;
  76.             pix: PixMapHandle;
  77.             h, v: Integer;
  78.             pixel: LongPtr;
  79.             maxV, maxH: integer;
  80.             theValue: Longint;
  81.     begin
  82.         if not gSAT.colorFlag then
  83.             Exit(SATPaintAlphaRect);
  84.         if port.device^^.gdPMap^^.pixelSize <> 32 then
  85.             Exit(SATPaintAlphaRect);
  86.  
  87.         SATGetPort(savePort);
  88.         SATSetPort(port);
  89.  
  90. {Shift value to the right place - the most significant byte}
  91.         theValue := BSL(value, 24);
  92.  
  93.         globalBox := box;
  94.         LocalToGlobal(globalBox.topLeft);
  95.         LocalToGlobal(globalBox.botRight);
  96.         pix := port.device^^.gdPMap;
  97.  
  98.         if box.bottom < port.port^.portRect.bottom then
  99.             maxV := box.bottom - 1
  100.         else
  101.             maxV := port.port^.portRect.bottom - 1;
  102.  
  103.         if box.right < port.port^.portRect.right then
  104.             maxH := box.right - 1
  105.         else
  106.             maxH := port.port^.portRect.right - 1;
  107.  
  108.         if box.left < maxH then
  109.             if box.top < maxV then
  110.                 for v := box.top to maxV do
  111.                     begin
  112.                         pixel := LongPtr(Longint(pix^^.baseAddr) + BitAnd(pix^^.rowBytes, $3fff) * Longint(v) + 4 * box.left);
  113.                         for h := box.left to maxH do
  114.                             begin
  115.                                 pixel^ := BitOr(pixel^, theValue); {Paint}
  116.                                 pixel := LongPtr(Longint(pixel) + 4);
  117.                             end;
  118.                     end;
  119.  
  120.         SATSetPort(savePort);
  121.     end; {SATPaintAlphaRect}
  122.  
  123.     procedure SATEraseAlphaRect (box: Rect; port: SATPort);
  124.         type
  125.             LongPtr = ^Longint;
  126.         var
  127.             savePort: SATPort;
  128.             globalBox: Rect;
  129.             pix: PixMapHandle;
  130.             h, v: Integer;
  131.             pixel: LongPtr;
  132.             maxV, maxH: integer;
  133.     begin
  134.         if not gSAT.colorFlag then
  135.             Exit(SATEraseAlphaRect);
  136.         if port.device^^.gdPMap^^.pixelSize <> 32 then
  137.             Exit(SATEraseAlphaRect);
  138.  
  139.         SATGetPort(savePort);
  140.         SATSetPort(port);
  141.  
  142.         globalBox := box;
  143.         LocalToGlobal(globalBox.topLeft);
  144.         LocalToGlobal(globalBox.botRight);
  145.         pix := port.device^^.gdPMap;
  146.  
  147.         if box.bottom < port.port^.portRect.bottom then
  148.             maxV := box.bottom - 1
  149.         else
  150.             maxV := port.port^.portRect.bottom - 1;
  151.  
  152.         if box.right < port.port^.portRect.right then
  153.             maxH := box.right - 1
  154.         else
  155.             maxH := port.port^.portRect.right - 1;
  156.  
  157.         if box.left < maxH then
  158.             if box.top < maxV then
  159.                 for v := box.top to maxV do
  160.                     begin
  161.                         pixel := LongPtr(Longint(pix^^.baseAddr) + BitAnd(pix^^.rowBytes, $3fff) * Longint(v) + 4 * box.left);
  162.                         for h := box.left to maxH do
  163.                             begin
  164.                                 pixel^ := BitAnd(pixel^, $00ffffff); {Erase}
  165.                                 pixel := LongPtr(Longint(pixel) + 4);
  166.                             end;
  167.                     end;
  168.  
  169.         SATSetPort(savePort);
  170.     end; {SATEraseAlphaRect}
  171.  
  172. end.